package com.gzhu.knowledgeAdmin.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.*;



// 外呼
@Slf4j
@Controller
@RequestMapping({"/zs/ai/outbound"})
public class Ai_out_controller {

//    private EslServiceImpl eslServiceImpl;

    //记录定时器timer的类，用于停止定时器
    public class company_task_timer{
        public String companyid;
        public long taskid;
        public Timer company_task_timer;
    }
    //记录定时器timer的数组，用于停止定时器
    ArrayList<company_task_timer> company_task_timerArrayList = new ArrayList<>();

    // ai呼出-用TTS
    // 输入json：
    // {
    //     phone_number       //待呼出的电话号码
    //     text               //文本
    //     speaker_id           //音色id
    //     speed              //音速
    //     volume             //音量
    //     gsid               //公司id
    // }
    // 返回json：
    // {
    //    success:,//成功标志
    //    code:,//状态码
    //    message:””//提示信息
    //    data：“”//传输参数
    // }

    //未完成此接口
    //单个电话外呼--入口参数：电话号码，语音文本，说话人，速度，音量
    @ResponseBody
    @RequestMapping(value={ "/TTS/phonenumber"}, method= {RequestMethod.POST})
    public JSONObject AiTTSbyPhoneNumber(@RequestBody Map params) throws URISyntaxException, IOException, InterruptedException {

        //返回初始化
        JSONObject rtn_error = new JSONObject();
        rtn_error.put("success", false);      //成功标志
        rtn_error.put("code",  -1);            //状态码
        rtn_error.put("message", "");          //提示信息
        rtn_error.put("data", "");            //结果数据
        //返回初始化
        JSONObject rtn_right = new JSONObject();
        rtn_right.put("success", true);       //成功标志
        rtn_right.put("code",  0);            //状态码
        rtn_right.put("message", "");         //提示信息
        rtn_right.put("data", "");            //结果数据

        //入口参数
        String phone_number = (String) params.get("phone_number");
        String text = (String) params.get("text");
        String speaker_id = (String) params.get("speaker_id");
        double speed = Double.parseDouble((String)params.get("speed"));
        double volume = Double.parseDouble((String)params.get("volume"));
        String company_id = (String) params.get("company_id");
        System.out.println("phone number: " + phone_number);
        System.out.println("text: " + text);
        System.out.println("speaker id: " + speaker_id);



        //返回response
        return rtn_right;
    }

    //公司自动批量外呼--入口参数:公司id,任务ids(Arraylist数组)
    @ResponseBody
    @RequestMapping(value={ "/batchtasks"}, method= {RequestMethod.POST})
    public JSONObject AiTTSbyCompanyTask(@RequestBody Map params) throws URISyntaxException, IOException, InterruptedException
    {
//        int rtn;
//        //返回初始化
        JSONObject rtn_error = new JSONObject();
        rtn_error.put("success", false);      //成功标志
        rtn_error.put("code",  -1);            //状态码
        rtn_error.put("message", "");          //提示信息
        rtn_error.put("data", "");            //结果数据
        //返回初始化
        JSONObject rtn_right = new JSONObject();
        rtn_right.put("success", true);       //成功标志
        rtn_right.put("code",  20000);            //状态码
        rtn_right.put("message", "");         //提示信息
        rtn_right.put("data", "");            //结果数据

        //入口参数:公司id,任务ids(Arraylist数组)
        String company_id = (String) params.get("company_id");
        ArrayList task_ids = (ArrayList) params.get("task_ids");
        System.out.println("company_id: " + company_id + " task_ids:" + task_ids);
//
//        for(int i=0; i<task_ids.size(); i++)
//        {
//            //单个task_id
//            long task_id = Long.parseLong((String) task_ids.get(i));
//
//            // 查询数据库-全局设置表，任务表，全部任务明细表
//            System.out.println("准备读取外呼任务参数及外呼数据...");
//            DataQjszPO dataQjszPO = new DataQjszPO();
//            dataQjszPO = GetGlobalSetting.GetData(company_id);
//            if (dataQjszPO==null){
//                System.out.println("读取全局设置表错误");
//                rtn_error.put("message","读取全局设置表错误");
//                return rtn_error;
//            }
//            DataRwPO dataRwPO = GetTask.GetData(company_id, task_id);
//            if (dataRwPO == null){
//                System.out.println("读取任务表错误");
//                rtn_error.put("message","读取任务表错误");
//                return rtn_error;
//            }
//            List<DataRwmxPO> dataRwmxPOS = new ArrayList<>();
//            dataRwmxPOS = GetTaskList.GetDataByTask(company_id, task_id);
//            if (dataRwmxPOS.size()<=0){
//                System.out.println("无法获取任务明细");
//                rtn_error.put("message","无法获取任务明细");
//                return rtn_error;
//            }
//
//            //根据任务（t_rw_t）的条件，删除dataRwmxPOS中的无效任务，保留有效任务明细
//            GenEffectiveTaskList genEffectiveTaskList = new GenEffectiveTaskList();
//            rtn = genEffectiveTaskList.genEffectiveTaskList(company_id,
//                                           task_id,
//                                           dataQjszPO,
//                                           dataRwPO,
//                                           dataRwmxPOS);
//            if (rtn == 1){
//                rtn_right.put("message", "任务已完成，返回 " + task_id);
//                rtn_right.put("message", "任务已完成，返回");
//                System.out.println("任务已完成，返回");
//                return rtn_right;
//            }
//            else if (rtn == 2){
//                rtn_right.put("message", "任务不在计划时间，停止任务 " + task_id);
//                rtn_right.put("message", "任务不在计划时间，停止任务");
//                System.out.println("任务不在计划时间，停止任务");
//                return rtn_right;
//            }
//            else if (rtn == 3){
//                rtn_right.put("message", "任务不在计划周日，停止任务 " + task_id);
//                rtn_right.put("message", "任务不在计划周日，停止任务");
//                System.out.println("任务不在计划周日，停止任务");
//                return rtn_right;
//            }
//
//            //任务为空，返回
//            if (dataRwmxPOS.size() == 0)
//            {
//                System.out.println("本次任务为空，返回");
//                rtn_right.put("message", "本次任务为空");
//                return rtn_right;
//            }
//
//            //设置IsProcessing标志位（该条记录是否正在处理,0:未被处理）
//            for(int k=0; k<dataRwmxPOS.size(); k++)
//            {
//                dataRwmxPOS.get(k).setIsProcessing("0");
//            }
//
//            //创建“执行任务”的标志文件：taskrunning_companyid_taskid.txt,防止重复运行
//            String workingDir = System.getProperty("user.dir");
//            String profilepath = workingDir + "\\taskrunning_" + company_id + "_"
//                    + task_id + ".txt";
//            File flagFile = new File(profilepath);
//            if(false == flagFile.createNewFile()) {
//                System.out.println("A previous instance is running or quit incorrect:" + profilepath);
//                return rtn_error;
//            }
//            flagFile.deleteOnExit();
//
//            //创建company_task_timer,加入集合
//            company_task_timer ctt = new company_task_timer();
//            ctt.companyid = company_id;
//            ctt.taskid = task_id;
//            ctt.company_task_timer = new Timer();
//            company_task_timerArrayList.add(ctt);
//
//            //定时器根据任务表字段立即或定时启动
//            if (dataRwPO.getF_RWQDFS() == 0)      //立即启动
//            {
//                System.out.println("即刻启动任务...");
//                try {
//                    ctt.company_task_timer.schedule(new AiTask(company_id,
//                                    task_id,
//                                    dataQjszPO,
//                                    dataRwPO,
//                                    dataRwmxPOS),
//                                   2000);           //2秒后开始执行
//                }catch(Exception e)
//                {
//                    rtn_error.put("message", "外呼任务启动失败");
//                    return rtn_error;
//                }
//
//            }
//            else if (dataRwPO.getF_RWQDFS() == 1)   //定时启动
//            {
//                String hour = dataRwPO.getF_DSQDSJ().trim().split(":")[0];
//                String minute = dataRwPO.getF_DSQDSJ().trim().split(":")[1];
//                Calendar calendar = Calendar.getInstance();
//                calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(hour));
//                calendar.set(Calendar.MINUTE, Integer.valueOf(minute));
//                calendar.set(Calendar.SECOND, 0);
//                Date scheduletime = calendar.getTime();          //当天的定时时间
//
//                System.out.println("启动定时任务...,任务启动时间: " + scheduletime);
//                try {
//                    ctt.company_task_timer.schedule(new AiTask(company_id,
//                                    task_id,
//                                    dataQjszPO,
//                                    dataRwPO,
//                                    dataRwmxPOS),
//                                    scheduletime);   //定时执行
//                }catch(Exception e)
//                {
//                    rtn_error.put("message", "外呼任务启动失败");
//                    return rtn_error;
//                }
//
//            }
//
//        }
//
//        rtn_right.put("message", "外呼任务启动成功");
        return rtn_error;

    }

//    //公司批量外呼--入口参数:公司id, 任务id，电话号码数组(Arraylist数组)
//    //{"company_id":"00001",
//    // "task_id":"10002",
//    // "phones":["1000","1001","1002"]
//    // }
//    @ResponseBody
//    @RequestMapping(value={ "/batchphones"}, method= {RequestMethod.POST})
//    public JSONObject AiPlayAudio(@RequestBody Map params) throws IOException, InterruptedException {
//        int rtn;
//        //返回初始化
//        JSONObject rtn_error = new JSONObject();
//        rtn_error.put("success", false);      //成功标志
//        rtn_error.put("code",  -1);            //状态码
//        rtn_error.put("message", "");          //提示信息
//        rtn_error.put("data", "");            //结果数据
//        //返回初始化
//        JSONObject rtn_right = new JSONObject();
//        rtn_right.put("success", true);       //成功标志
//        rtn_right.put("code",  0);            //状态码
//        rtn_right.put("message", "");         //提示信息
//        rtn_right.put("data", "");            //结果数据
//
//        //入口参数:公司id,任务ids(Arraylist数组)
//        String company_id = (String) params.get("company_id");
//        long task_id = Long.parseLong((String) params.get("task_id"));
//        ArrayList phones = (ArrayList) params.get("phones");
//        System.out.println("company_id: " + company_id + "task_id:" + task_id + "phones:" + phones);
//
//        for(int i=0; i<phones.size(); i++)
//        {
//            // 查询数据库-全局设置表，任务表，全部任务明细表
//            System.out.println("准备读取外呼任务参数及外呼数据...");
//            DataQjszPO dataQjszPO = new DataQjszPO();
//            dataQjszPO = GetGlobalSetting.GetData(company_id);
//            if (dataQjszPO==null){
//                System.out.println("读取全局设置表错误");
//                rtn_error.put("message","读取全局设置表错误");
//                return rtn_error;
//            }
//            DataRwPO dataRwPO = GetTask.GetData(company_id, task_id);
//            if (dataRwPO == null){
//                System.out.println("读取任务表错误");
//                rtn_error.put("message","读取任务表错误");
//                return rtn_error;
//            }
//
//            List<DataRwmxPO> dataRwmxPOS = new ArrayList<>();
//            dataRwmxPOS = GetTaskList.GetDataByPhones(company_id, task_id);
//            if (dataRwmxPOS.size()<=0){
//                System.out.println("无法获取任务明细");
//                rtn_error.put("message","无法获取任务明细");
//                return rtn_error;
//            }
//
//            //根据任务（t_rw_t）的条件，删除dataRwmxPOS中的无效任务，保留有效任务明细
//            GenEffectiveTaskList genEffectiveTaskList = new GenEffectiveTaskList();
//            rtn = genEffectiveTaskList.genEffectiveTaskList(company_id,
//                    task_id,
//                    dataQjszPO,
//                    dataRwPO,
//                    dataRwmxPOS);
//            if (rtn == 1){
//                rtn_right.put("message", "任务已完成，返回 " + task_id);
//                rtn_right.put("message", "任务已完成，返回");
//                System.out.println("任务已完成，返回");
//                return rtn_right;
//            }
//            else if (rtn == 2){
//                rtn_right.put("message", "任务不在计划时间，停止任务 " + task_id);
//                rtn_right.put("message", "任务不在计划时间，停止任务");
//                System.out.println("任务不在计划时间，停止任务");
//                return rtn_right;
//            }
//            else if (rtn == 3){
//                rtn_right.put("message", "任务不在计划周日，停止任务 " + task_id);
//                rtn_right.put("message", "任务不在计划周日，停止任务");
//                System.out.println("任务不在计划周日，停止任务");
//                return rtn_right;
//            }
//
//            //任务为空，返回
//            if (dataRwmxPOS.size() == 0)
//            {
//                System.out.println("本次任务为空，返回");
//                rtn_right.put("message", "本次任务为空");
//                return rtn_right;
//            }
//
//            //设置IsProcessing标志位（该条记录是否正在处理,0:未被处理）
//            for(int k=0; k<dataRwmxPOS.size(); k++)
//            {
//                dataRwmxPOS.get(k).setIsProcessing("0");
//            }
//
//            //创建“执行任务”的标志文件：taskrunning_companyid_taskid.txt,防止重复运行
//            String workingDir = System.getProperty("user.dir");
//            String profilepath = workingDir + "\\taskrunning_" + company_id + "_"
//                    + task_id + ".txt";
//            File flagFile = new File(profilepath);
//            if(false == flagFile.createNewFile()) {
//                System.out.println("A previous instance is running or quit incorrect:" + profilepath);
//                return rtn_error;
//            }
//            flagFile.deleteOnExit();
//
//            //创建company_task_timer,加入集合
//            company_task_timer ctt = new company_task_timer();
//            ctt.companyid = company_id;
//            ctt.taskid = task_id;
//            ctt.company_task_timer = new Timer();
//            company_task_timerArrayList.add(ctt);
//
//            //定时器根据任务表字段立即或定时启动
//            if (dataRwPO.getF_RWQDFS() == 0)      //立即启动
//            {
//                System.out.println("即刻启动任务...");
//                try {
//                    ctt.company_task_timer.schedule(new AiTask(company_id,
//                                    task_id,
//                                    dataQjszPO,
//                                    dataRwPO,
//                                    dataRwmxPOS),
//                            2000);           //2秒后开始执行
//                }catch(Exception e)
//                {
//                    rtn_error.put("message", "外呼任务启动失败");
//                    return rtn_error;
//                }
//
//            }
//            else if (dataRwPO.getF_RWQDFS() == 1)   //定时启动
//            {
//                String hour = dataRwPO.getF_DSQDSJ().trim().split(":")[0];
//                String minute = dataRwPO.getF_DSQDSJ().trim().split(":")[1];
//                Calendar calendar = Calendar.getInstance();
//                calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(hour));
//                calendar.set(Calendar.MINUTE, Integer.valueOf(minute));
//                calendar.set(Calendar.SECOND, 0);
//                Date scheduletime = calendar.getTime();          //当天的定时时间
//
//                System.out.println("启动定时任务...,任务启动时间: " + scheduletime);
//                try {
//                    ctt.company_task_timer.schedule(new AiTask(company_id,
//                                    task_id,
//                                    dataQjszPO,
//                                    dataRwPO,
//                                    dataRwmxPOS),
//                            scheduletime);   //定时执行
//                }catch(Exception e)
//                {
//                    rtn_error.put("message", "外呼任务启动失败");
//                    return rtn_error;
//                }
//
//            }
//
//        }
//
//        rtn_right.put("message", "外呼任务启动成功");
//        return rtn_right;
//    }

    //关闭启动的定时任务--入口参数：公司id,任务id
    @ResponseBody
    @RequestMapping(value={ "/StopCompanyTask"}, method= {RequestMethod.POST})
    public JSONObject StopCompanyTask(@RequestBody Map params) throws URISyntaxException, IOException, InterruptedException {
        //入口参数:公司id,任务ids(Arraylist数组)
        String company_id = (String) params.get("company_id");
        ArrayList task_ids = (ArrayList) params.get("task_ids");
        System.out.println("company_id: " + company_id + " task_ids:" + task_ids);

        //返回初始化
        JSONObject rtn_error = new JSONObject();
        rtn_error.put("success", false);      //成功标志
        rtn_error.put("code",  -1);            //状态码
        rtn_error.put("message", "");          //提示信息
        rtn_error.put("data", "");            //结果数据
        //返回初始化
        JSONObject rtn_right = new JSONObject();
        rtn_right.put("success", true);       //成功标志
        rtn_right.put("code",  0);            //状态码
        rtn_right.put("message", "");         //提示信息
        rtn_right.put("data", "");            //结果数据

        //循环
        for(int i=0; i<task_ids.size(); i++) {
            //单个task_id
            long task_id = Long.parseLong((String) task_ids.get(i));

            //停止timer
            for (int j=0; j<company_task_timerArrayList.size(); j++)
            {
                String c_id = company_task_timerArrayList.get(j).companyid;
                long t_id = company_task_timerArrayList.get(j).taskid;
                if (t_id == task_id && c_id.equals(company_id))
                {
                    company_task_timerArrayList.get(j).company_task_timer.cancel();
                    company_task_timerArrayList.remove(j);
                    System.out.println("company_id: " + company_id + " task_ids:" + task_ids + "停止任务成功");
                }

                //删除对应的标志文件
                String workingDir = System.getProperty("user.dir");
                String profilepath = workingDir + "\\taskrunning_" + company_id + "_"
                        + task_id + ".txt";
                File flagFile = new File(profilepath);
                //文件是否存在
                if (flagFile.exists()) {
                    //删除标志文件
                    if (flagFile.delete()) {
                        System.out.println("正在停止外呼任务");
                        Thread.sleep(2000);
                        System.out.println("停止外呼任务");
                        return rtn_right;
                    } else {
                        System.out.println("标志文件删除失败！");
                        return rtn_error;
                    }
                } else {
                    System.out.println("标志文件不存在！");
                    return  rtn_error;
                }
            }
        }
        System.out.println("company_id: " + company_id + " task_ids:" + task_ids + "停止任务成功");
        return rtn_right;
    }


    // 接收地址参数
    // input: phone_number 待呼出的电话号码
    // 返回：
    @ResponseBody
    @RequestMapping(value={ "/hangup/{phone_number}"}, method= {RequestMethod.POST})
    public JSONObject ai_outbound_hangup(@PathVariable("phone_number") String phone_number){
        JSONObject rtn = new JSONObject();
        rtn.put("success", false);      //成功标志
        rtn.put("code",  -1);            //状态码
        rtn.put("message", "");          //提示信息
        rtn.put("data", "");            //结果数据
        return rtn;
    }

    //接收json
    //{
    // "name":"aaaa",
    // "age":10
    // }

    @ResponseBody
    @RequestMapping(value={ "/testjson"}, method= {RequestMethod.POST})
    public JSONObject ai_outbound_by_json(@RequestBody Map params){
        JSONObject rtn = new JSONObject();
        rtn.put("success", false);      //成功标志
        rtn.put("code",  -1);            //状态码
        rtn.put("message", "");          //提示信息
        rtn.put("data", "");            //结果数据

        System.out.println("name" + params.get("name") + params.get("age"));

        return rtn;
    }

    //接收表单参数
    // /testparams？phone_number=1234566&id=2123123
    @ResponseBody
    @RequestMapping(value={ "/testparams"}, method= {RequestMethod.POST})
    public String ai_outbound_by_params(@RequestParam("phone_number") String phone_number,
                                        @RequestParam("id") String id){

        return phone_number + "   " + id;
    }



}
